package 双指针;

/**
 * 要将数组 [0, 1, -1, 0, 1, -1] 中的 0 都放在左边，1 都放在右边，可以采用三指针的方法来解决这个问题。
 * 具体思路是维护三个指针：一个指针 left 从数组的最左边开始，用于标记 0 应该存放的位置；一个指针 right
 * 从数组的最右边开始，用于标记 1 应该存放的位置；还有一个指针 current 从数组的最左边开始，用于遍历数组
 */
public class _移动0或者1 {

    public void sort(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int current = 0;

        while (current <= right) {
            if (nums[current] == 0) {
                // 如果当前元素是 0，将其与 left 指针指向的元素交换
                int temp = nums[left];
                nums[left] = nums[current];
                nums[current] = temp;
                left++;
                current++;
            } else if (nums[current] == 1) {
                // 如果当前元素是 1，将其与 right 指针指向的元素交换
                int temp = nums[right];
                nums[right] = nums[current];
                nums[current] = temp;
                right--;
            } else {
                // 如果当前元素是 -1，直接移动 current 指针
                current++;
            }
        }
    }

    public static void main(String[] args) {
        int[] nums = {0, 1, -1, 0, 1, -1};
        _移动0或者1 _移动0或者1 = new _移动0或者1();
        _移动0或者1.sort(nums);
        // 输出排序后的数组
        for (int num : nums) {
            System.out.print(num + " ");
        }
    }
}
